package com.biye.api.config;

import com.biye.api.tool.redis.RedisProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.util.LinkedHashSet;
import java.util.Set;

@Configuration
@ConditionalOnClass({JedisCluster.class})
public class RedisConfig {

    @Autowired
    RedisProperties redisProperties;

    /**
     * 注意：
     * 这里返回的JedisCluster是单例的，并且可以直接注入到其他类中去使用
     * @return
     */
    @Bean
    public JedisCluster getJedisCluster() {
        Set<HostAndPort> nodes = new LinkedHashSet<>();
        for (String ipPort : redisProperties.getIpPorts()) {
            String[] ipPortPair = ipPort.split(":");
            nodes.add(new HostAndPort(ipPortPair[0].trim(), Integer.valueOf(ipPortPair[1].trim())));
        }
        // Jedis连接池配置
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        // 最大连接数, 默认8个
        jedisPoolConfig.setMaxTotal(redisProperties.getMAX_ACTIVE());
        // 最大空闲连接数, 默认8个
        jedisPoolConfig.setMaxIdle(redisProperties.getMAX_IDLE());
        // 最小空闲连接数, 默认0
        jedisPoolConfig.setMinIdle(redisProperties.getMIN_IDLE());
        // 最大等待连接数, 默认0个
        jedisPoolConfig.setMaxWaitMillis(redisProperties.getMAX_WAIT());
        // 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,  默认-1
        jedisPoolConfig.setMaxWaitMillis(redisProperties.getTIME_OUT()); // 设置2秒
        // jmx管理，默认为true
        jedisPoolConfig.setJmxEnabled(true);
        //对拿到的connection进行validateObject校验
        jedisPoolConfig.setTestOnBorrow(true);
        JedisCluster jedisCluster = new JedisCluster(nodes, jedisPoolConfig);
        return jedisCluster;
    }

}
